package cn.kent.base.unsafe;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * 使用反射使用Unsafe类
 * Unsafe:使用JNI方式访问本地C++实现库，所以不安全，通过限制加载器让开发人员不能正常使用，但是可以通过反射使用。
 */
public class TestUnsafe2 {

    static final Unsafe unsafe;
    static final long stateOffset;
    private volatile long state = 0;

    static {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);// 设置为可存取
            unsafe = (Unsafe) field.get(null);
            // 获取state变量在TestUnsafe2中的偏移量
            stateOffset = unsafe.objectFieldOffset(TestUnsafe2.class.getDeclaredField("state"));
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new Error(e);
        }
    }

    public static void main(String[] args) {
        TestUnsafe2 test = new TestUnsafe2();
        boolean success = unsafe.compareAndSwapInt(test, stateOffset, 0, 1);
        System.out.println(success);
    }
}
